#include <iostream>
#include <limits>
#include <vector>
#include "../lib/igloo/igloo.h"
#include "../../Interfaces/InterfazAdministrador.h"
#include "../../Archivos/Configuracion.h"
#include "../../Archivos/Log.h"
#include "../../Interfaces/AdministradorABM.h"
#include "../../Interfaces/CandidatoABM.h"
#include "../../Interfaces/InterfazVotante.h"
#include "../../Interfaces/IAbm.h"
#include "../../Manejadores/ManejadorDistrito.h"
#include "../../Manejadores/ManejadorVotante.h"
#include "../../Manejadores/ManejadorEleccion.h"
#include "../../Manejadores/ManejadorCargo.h"
#include "../../Manejadores/ManejadorLista.h"
#include "../../Manejadores/ManejadorAdministrador.h"
#include "../../Manejadores/ManejadorCandidato.h"
#include "../../Entidades/Candidato.h"


using namespace igloo;
using namespace Interfaces;
using namespace ABM;
using namespace Manejadores;
using namespace Entidades;

Context(AltaMasivaTest) {

	ManejadorAdministrador* manejadorAdministrador;
	ManejadorCandidato* manejadorCandidato;
	ManejadorCargo* manejadorCargo;
	ManejadorDistrito* manejadorDistrito;
	ManejadorEleccion* manejadorEleccion;
	ManejadorLista* manejadorLista;
	ManejadorVotante* manejadorVotante;

	void SetUp() {
		manejadorAdministrador = new ManejadorAdministrador();
		manejadorCargo = new ManejadorCargo();
		manejadorCandidato = new ManejadorCandidato();
		manejadorDistrito = new ManejadorDistrito();
		manejadorEleccion = new ManejadorEleccion();
		manejadorLista = new ManejadorLista();
		manejadorVotante = new ManejadorVotante();
	}

	void TearDown() {
		delete manejadorAdministrador;
		delete manejadorCandidato;
		delete manejadorCargo;
		delete manejadorDistrito;
		delete manejadorEleccion;
		delete manejadorLista;
		delete manejadorVotante;
	}

	Spec(distrito) {
		DistritoABM* distritoAbm = new DistritoABM();
		distritoAbm->altaMasiva();

		Assert::That(manejadorDistrito->existe("san clemente del tuyu"));
		delete distritoAbm;
	}

	Spec(administrador) {
		AdministradorABM* adminAbm = new AdministradorABM();
		adminAbm->altaMasiva();

		Assert::That(manejadorAdministrador->existe("admin3"));
		delete adminAbm;
	}

	Spec(cargo) {
		CargoABM* cargoAbm = new CargoABM();
		cargoAbm->altaMasiva();

		Assert::That(manejadorCargo->existe("diputado 1"));
		delete cargoAbm;
	}
	Spec(votante) {
		VotanteABM* votanteAbm = new VotanteABM();
		votanteAbm->altaMasiva();

		Assert::That(manejadorVotante->existe("38345567"));
		delete votanteAbm;
	}

	Spec(eleccion) {
		EleccionABM* eleccionAbm = new EleccionABM();
		eleccionAbm->altaMasiva();

		Assert::That(manejadorEleccion->existe(20111023, "presidente"));
		delete eleccionAbm;
	}

	Spec(lista) {
		ListaABM* listaAbm = new ListaABM();
		listaAbm->altaMasiva();

		Assert::That(manejadorLista->existe(20111023,"presidente", "lista 1"));
		delete listaAbm;
	}

	Spec(candidato) {
		CandidatoABM* candidatoAbm = new CandidatoABM();
		candidatoAbm->altaMasiva();

		vector<Candidato*>* candidatos = manejadorCandidato->recuperarCandidatosPorLista("20111023","vicepresidente","lista 1");
		string cargo = candidatos->at(0)->getCargo()->getNombre();

		Assert::That(cargo, Is().EqualTo("vicepresidente"));
		delete candidatoAbm;
		for (unsigned int i = 0; i < candidatos->size(); ++i) {
			delete candidatos->at(i);
		}
		delete candidatos;
	}
};
